(deftemplate intrebare
        (slot stringIntrebare)
        (slot raspuns)
)
(deftemplate diagnosticMedical
(slot nume)
)
(assert (intrebare (stringIntrebare nil)(raspuns nil)))
(printout t  crlf "     >>> DIAGNOSTIC MEDICAL <<< " crlf "Veti primi o serie de intrebari. Raspundeti cu DA sau NU." crlf )

(deffunction get-salience (?name)
  (bind ?s (fetch (str-cat ?name "-salience")))
  (if (eq ?s nil) then
        (return 0)
   else
        (return ?s)))

(deffunction set-salience (?name, ?value)
  (store (str-cat ?name "-salience") ?value))

(set-salience-evaluation every-cycle)



;ramura radacina "Aveti febra?"
(defrule q1
    (declare (salience 18))   ; salience seteaza prioritatea regulilor-> 18 > 17 deci o va efectua prima data
        (intrebare (stringIntrebare nil)(raspuns nil))
        =>
        (printout t "Aveti febra? (DA/NU)" crlf)
        (bind ?r (read))                                       ;;bind - citeste d la tastatura si punbe in variabila r
        (assert (intrebare (stringIntrebare "Aveti febra? (DA/NU)")(raspuns ?r)))
)

;prima ramura a radacinii
(defrule q2
    (declare (salience 17))
        (intrebare (stringIntrebare "Aveti febra? (DA/NU)")(raspuns DA))
        =>
        (printout t "Tusiti? (DA/NU)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Tusiti? (DA/NU)")(raspuns ?r)))
)

;prima ramura pt "Tusiti?"
(defrule q3
    (declare (salience 16))
        (intrebare (stringIntrebare "Tusiti? (DA/NU)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti o viroza respiratorie." crlf)
)

(defrule q4
    (declare (salience 15))
        (intrebare (stringIntrebare "Tusiti? (DA/NU)")(raspuns NU))
        =>
        (printout t "Aveti dureri? (DA)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri? (DA)")(raspuns ?r)))
)

(defrule q5
    (declare (salience 14))
        (intrebare (stringIntrebare "Aveti dureri? (DA)")(raspuns DA))
        =>
        (printout t "Aveti dureri de gat? (DA/NU)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri de gat? (DA/NU)")(raspuns ?r)))
)

(defrule q6
    (declare (salience 13))
        (intrebare (stringIntrebare "Aveti dureri de gat? (DA/NU)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti amigdalita." crlf)

)
(defrule q7
    (declare (salience 12))
        (intrebare (stringIntrebare "Aveti dureri de gat? (DA/NU)")(raspuns NU))
        =>
        (printout t "Aveti dureri lombare? (DA/NU)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri lombare? (DA/NU)")(raspuns ?r)))
)

(defrule q8
    (declare (salience 11))
        (intrebare (stringIntrebare "Aveti dureri lombare? (DA/NU)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti o infectie urinara. " crlf)

)
(defrule q9
    (declare (salience 10))
        (intrebare (stringIntrebare "Aveti dureri lombare? (DA/NU)")(raspuns NU))
        =>
        (printout t "DIAGNOSTIC: Aveti o boala renala." crlf)
)


;a doua ramura a radacinii "Aveti febra"
(defrule q10
    (declare (salience 9))
        (intrebare (stringIntrebare "Aveti febra? (DA/NU)")(raspuns NU))
        =>
        (printout t "Aveti dureri?(DA/NU)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri? (DA/NU)")(raspuns ?r)))
)

(defrule q11
    (declare (salience 8))
        (intrebare (stringIntrebare "Aveti dureri? (DA/NU)")(raspuns DA))
        =>
        (printout t "Aveti dureri de cap? (DA/NU)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri de cap? (DA/NU)")(raspuns ?r)))
)

(defrule q12
    (declare (salience 7))
        (intrebare (stringIntrebare "Aveti dureri de cap? (DA/NU)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti HTA - hipertensiune arteriala. " crlf)
)


(defrule q13
    (declare (salience 6))
        (intrebare (stringIntrebare "Aveti dureri de cap? (DA/NU)")(raspuns NU))
        =>
        (printout t "Aveti dureri articulare? (DA)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti dureri articulare? (DA)")(raspuns ?r)))
)

(defrule q14
    (declare (salience 5))
        (intrebare (stringIntrebare "Aveti dureri articulare? (DA)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti o boala reumatica. " crlf)
)

(defrule q15
    (declare (salience 4))
        (intrebare (stringIntrebare "Aveti dureri? (DA/NU)")(raspuns NU))
        =>
        (printout t "Aveti culoarea pielii schimbata? (DA)" crlf)
        (bind ?r (read))                                    
        (assert (intrebare (stringIntrebare "Aveti culoarea pielii schimbata? (DA)")(raspuns ?r)))
)
(defrule q16
    (declare (salience 3))
        (intrebare (stringIntrebare "Aveti culoarea pielii schimbata? (DA)")(raspuns DA))
        =>
        (printout t "DIAGNOSTIC: Aveti o posibila hepatita. Va sugeram sa efectuati si alte analize." crlf)
)

(run)
(facts)